/**
  ******************************************************************************
  * @file     
  * @author   古么宁
  * @brief    报文解析头文件
  * @date     
  ******************************************************************************
  *
  * COPYRIGHT(c) 2019 GoodMorning
  *
  ******************************************************************************
  */
#ifndef _IEC_PKT_PARSER_H_
#define _IEC_PKT_PARSER_H_



#if (ENABLE_PKT_PARSER)

	#define iec10x_err(x,...) \
	do {\
		if ((x)->dbglevel && (x)->printf)  \
			(x)->printf("\r\n<!>:"__VA_ARGS__);\
	}while(0)


	#define iec10x_warn(x,...) \
	do {\
		if ((x)->dbglevel && (x)->printf)  \
			(x)->printf("\r\n[*]:"__VA_ARGS__);\
	}while(0)


	#define iec10x_msg(x,...) \
	do {\
		if ((x)->dbglevel && (x)->printf)  \
			(x)->printf("\r\n(#):"__VA_ARGS__);\
	}while(0)


	#define IEC101_PACKET_INFO(x,buf,len,typ)    \
	do {\
		if ((x)->dbglevel > IEC_DBG_LOW && (x)->printf)  \
		iec101_packet_parser(x,buf,len,typ);\
	}while(0)


	#define IEC104_PACKET_INFO(x,buf,len,typ)    \
	do {\
		if ((x)->dbglevel > IEC_DBG_LOW && (x)->printf)  \
		iec104_packet_parser(x,buf,len,typ);\
	}while(0)

#else
	#define iec10x_err(...)
	#define iec10x_warn(...)
	#define iec10x_msg(...)
	#define IEC101_PACKET_INFO(x,buf,len,typ)
	#define IEC104_PACKET_INFO(x,buf,len,typ)
#endif

typedef enum iec_pkt_type {
	IEC_RX_PKT = 0 ,       ///< 总线接收到的报文
	IEC_TX_PKT             ///< 总线发送的报文
}
iec_pkt_t;

/**
  * @brief    解析一帧 101 报文
  * @author   古么宁 
  * @param    bus      : 总线
  * @param    data     : 接收到的报文
  * @param    pktlen   : 接收到的报文长度
  * @param    pkttype  : 报文类型 @see iec_pkt_t
  * @return   don't care
*/
void iec101_packet_parser(iec10x_t * bus,unsigned char * data , int pktlen , iec_pkt_t type);

/**
  * @brief    解析一帧 104 报文
  * @author   古么宁 
  * @param    bus      : 总线
  * @param    data     : 接收到的报文
  * @param    pktlen   : 接收到的报文长度
  * @param    pkttype  : 报文类型 @see iec_pkt_t
  * @return   don't care
*/
void iec104_packet_parser(iec10x_t * bus,unsigned char * data , int pktlen ,iec_pkt_t pkttype);

#if (ENABLE_PKT_PARSER)
	void    iec10x_parser_init(void);
#else
	#define iec10x_parser_init()
#endif

#endif
